﻿using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.IO;
using System.Collections.Generic;

namespace Conference.Web
{
    [ServiceContract(Namespace = "")]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class VideoService
    {
        private Dictionary<String, byte[]> frames = new Dictionary<string, byte[]>(); //словник для зберігання відеофрагментів

        private Dictionary<String, byte[]> slices = new Dictionary<String, byte[]>(); //словник для зберігання аудіофрагментів

        /// <summary>
        /// Процедура авторізації на боці серверу.
        /// </summary>
        /// <param name="name">Ім'я користувача.</param>
        /// <returns>"Істина", якщо авторизация пройдена успішно.</returns>
        [OperationContract]
        public Boolean LogIn(String name)
        {
            foreach (KeyValuePair<String, byte[]> kvp in frames) //перевірка на існування користувача
                if (kvp.Key.Equals(name))
                    return false;
            frames.Add(name, null); //ініциалізація словнику відеофрагментів
            slices.Add(name, null); //ініциалізація словнику аудиофрагментів
            return true;
        }

        /// <summary>
        /// Процедура виходу із системи.
        /// </summary>
        /// <param name="name">Ім'я користувача.</param>
        [OperationContract]
        public void LogOut(String name)
        {
            frames.Remove(name); //видалення користувача зі словника відеофрагментів
            slices.Remove(name); //видалення користувача зі словника аудиофрагментів
        }

        /// <summary>
        /// Процедура отримання списку поточних користувачів системи.
        /// </summary>
        /// <returns>Масив імен поточних користувачів.</returns>
        [OperationContract]
        public String[] GetUsers()
        {
            return frames.Keys.ToArray();
        }

        /// <summary>
        /// Процедура відправки аудіофрагментів на сервер.
        /// </summary>
        /// <param name="name">Им'я цільового користувача.</param>
        /// <param name="audio_array">Масив байтів, що зберігає аудіофрагмент.</param>
        [OperationContract]
        public void ToServerAudio(String name, byte[] audio_array)
        {
            slices[name] = audio_array;
        }

        /// <summary>
        /// Процедура отримання аудіофрагменту з сервера.
        /// </summary>
        /// <param name="name">Ім'я цільового користувача.</param>
        /// <returns>Масив байтів, що зберігає аудіофрагмент.</returns>
        [OperationContract]
        public byte[] FromServerAudio(String name)
        {
            return slices[name];
        }

        /// <summary>
        /// Процедура відправки відеофрагментів на сервер.
        /// </summary>
        /// <param name="name">Ім'я цільового користувача.</param>
        /// <param name="video_array">Масив байтів, що зберігає відеофрагмент.</param>
        [OperationContract]
        public void ToServerVideo(String name, byte[] video_array)
        {
            frames[name] = video_array;
        }

        /// <summary>
        /// Процедура отримання відеофрагменту з сервера.
        /// </summary>
        /// <param name="name">Ім'я цільового користувача.</param>
        /// <returns>Масив байтів, що зберігає відеофрагмент.</returns>
        [OperationContract]
        public byte[] FromServerVideo(String name)
        {
            return frames[name];
        }
    }
}
